package org.biblicalcontent.gbsbijbel.internal;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.TypedQuery;

import org.biblicalcontent.gbsbijbel.IGbsBijbelService;
import org.biblicalcontent.gbsbijbel.internal.entities.Bijbel;
import org.biblicalcontent.gbsbijbel.internal.entities.Bijbelboek;
import org.biblicalcontent.gbsbijbel.internal.entities.Hoofdstuk;
import org.biblicalcontent.gbsbijbel.internal.entities.Testament;
import org.biblicalcontent.gbsbijbel.model.IBijbel;
import org.biblicalcontent.gbsbijbel.model.IBijbelboek;
import org.biblicalcontent.gbsbijbel.model.IHoofdstuk;
import org.biblicalcontent.gbsbijbel.model.ITestament;

public class GbsBijbelServiceImpl implements IGbsBijbelService {

	private EntityManager em;

	private Object bijbel;

	private static EntityManagerFactory emf = null;

	private EntityManagerFactory getEntityManagerFactory() {
		if (emf == null) {
			emf = Persistence.createEntityManagerFactory("$objectdb/bijbel/gbs.odb");
		}
		return emf;
	}

	public GbsBijbelServiceImpl() {
		emf = getEntityManagerFactory();
		em = emf.createEntityManager();
	}

	@Override
	public IBijbel getBijbel() {
		if (this.bijbel == null) {
			bijbel = em.createQuery("SELECT b from Bijbel b", Bijbel.class).getSingleResult();
		}
		return (IBijbel) bijbel;
	}

	@Override
	public List<ITestament> getTestamenten() {
		List<Testament> testamenten = em.createQuery("SELECT t from Testament t", Testament.class).getResultList();
		return new ArrayList<ITestament>(testamenten);
	}

	@Override
	public List<IBijbelboek> getBijbelboeken() {
		List<Bijbelboek> bijbelboeken = em.createQuery("SELECT b from Bijbelboek b", Bijbelboek.class).getResultList();
		return new ArrayList<IBijbelboek>(bijbelboeken);
	}

	@Override
	public IHoofdstuk getHoofdstuk(IBijbelboek bijbelboek, int hoofdstuknummer) {
		TypedQuery<Hoofdstuk> query = em.createQuery("SELECT h from Hoofdstuk h "
				+ "where h.bijbelboekId = :bijbelboekId and h.hoofdstukNummer = :hoofdstukNummer", Hoofdstuk.class);
		query.setParameter("bijbelboekId", bijbelboek.getId());
		query.setParameter("hoofdstukNummer", Integer.valueOf(hoofdstuknummer));
		IHoofdstuk hoofdstuk = query.getSingleResult();
		return hoofdstuk;
	}
}
